import java.util.Arrays;
import java.util.List;

/**
 * NumberHelper 演示：
 * 1. 非泛型两个重载方法
 * 2. 合并成 1 个泛型方法
 * 3. 主方法里观察装箱 / 拆箱过程
 */
public class NumberHelper {

    /* --------------------------------------------------
     * 1. 接收 List<Integer>，返回 double 和
     * -------------------------------------------------- */
    public static double sumIntList(List<Integer> list) {
        double sum = 0;
        // 自动拆箱：Integer -> int，再提升成 double
        for (Integer n : list) {
            sum += n;   // n 是 Integer，+ 运算时会拆箱成 int
        }
        return sum;
    }

    /* --------------------------------------------------
     * 2. 接收 List<Double>，返回 double 和
     * -------------------------------------------------- */
    public static double sumDoubleList(List<Double> list) {
        double sum = 0;
        // 自动拆箱：Double -> double
        for (Double n : list) {
            sum += n;   // n 是 Double，+ 运算时会拆箱成 double
        }
        return sum;
    }

    /* --------------------------------------------------
     * 3. 泛型版本：写一次，同时支持 Integer 和 Double
     *    利用通配符上界 <? extends Number> 限定只能是数字类型
     * -------------------------------------------------- */
     public static double sumGeneric(List<? extends Number> list) {
        double sum = 0;
        for (Number num : list) {
            if (num instanceof Integer) {
                // Integer 直接拆成 int 再加，效率更高
                sum += num.intValue();
            } else {
                // Double 等其他 Number 子类
                sum += num.doubleValue();
            }
        }
        return sum;
    }
    /* --------------------------------------------------
     * 4. 主方法：验证上述 3 个方法，并演示装箱 / 拆箱
     * -------------------------------------------------- */
     public static void main(String[] args) {
        List<Integer> intList = Arrays.asList(1, 2, 3, 4);
        List<Double>  doubleList = Arrays.asList(1.1, 2.2, 3.3);

        System.out.println("========== Integer List 求和 ==========");
        System.out.println("泛型方法结果： " + sumGeneric(intList));

        System.out.println("\n========== Double List 求和 ==========");
        System.out.println("泛型方法结果： " + sumGeneric(doubleList));

        System.out.println("\n========== 手动观察装箱 ==========");
        List<Integer> manualList = new java.util.ArrayList<>();
        int primitive = 5;
        manualList.add(primitive);   // 自动装箱
        System.out.println("手动 add 后列表内容： " + manualList);
    }
}
